﻿/* Sourcecode2HTML
 * Copyright (c) 2008 Евгений Кукло, Евгений Казбан, Иван Власов
 * ФКН 3-ий курс, группа 2.2
 * --------------------------------------------------------------
 * Program.cs
 * Главный класс приложения 
*/
using System;
using System.Collections;
using System.Collections.Specialized;
using System.IO;

namespace Sourcecode2HTML
{
    /// <summary>
    /// Main class
    /// </summary>
    class Program
    {
        private static string InputDirectory;
        private static string InputFile;
        private static string OutpuDirectory;
        private static string OutputFile;
        private static string DefaultCSSFile;
        private static string PluginsFolder;
        private static bool UseUTF;
        private static bool WriteLineNumbers;
        private static string _version = "0.0.2 Pre-RC02";
        private static StringDictionary Params = new StringDictionary();
        private static ArrayList Files = new ArrayList();
        private static ArrayList SubDirs = new ArrayList();

        /// <summary>
        /// Enter point
        /// </summary>
        /// <param name="args">Parameters of command line</param>
        static void Main(string[] args)
        {
            sysCmdArg Parameters = new sysCmdArg(args);
            sysGlobal.Log.startLog("sourcecode2html");
            sysGlobal.Log.writeLog("Старт программы.", "");
            Params = sysGlobal.Config.ReadConfig();

            if (Parameters["use-utf"]!= null)
            {
                UseUTF = true; 
            }
            else
            {
                if (Params["UseUTF"] == "True")
                {
                    UseUTF = true;
                }
                if (Params["UseUTF"] == "False")
                {
                    UseUTF = false;
                }
            }

            if (Parameters["linenumbers"] != null)
            {
                WriteLineNumbers = true;
            }
            else
            {
                if (Params["WriteLineNumbers"] == "True")
                {
                    WriteLineNumbers = true;
                }
                if (Params["WriteLineNumbers"] == "False")
                {
                    WriteLineNumbers = false;
                }
            }

            PluginsFolder = Params["PluginsFolder"];

            if ((Parameters["css"] != null) && (Parameters["css"] != "true"))
            {
                DefaultCSSFile = Parameters["css"];
            }
            else
            {
                if (Params["DefaultCSSFile"] != null)
                {
                    DefaultCSSFile = Params["DefaultCSSFile"];
                }
            }

            sysGlobal.Plugin.PluginFolder = Environment.CurrentDirectory + "\\" + PluginsFolder;
            sysGlobal.Plugin.FindPlugins();

            if ((Parameters["i"] != null) && (Parameters["o"] != null))
            {
                if ((Parameters["din"] == null) && (Parameters["dout"] == null))
                {
                    sysGlobal.Log.writeLog("Попытка поиска входного файла...", "");
                    InputFile = Parameters["i"];
                    OutputFile = Parameters["o"];
                    FileInfo file = new FileInfo(InputFile);
                    if (file.Exists)
                    {
                        sysGlobal.Log.writeLog("Входной файл успешно найден.", "OK");
                        sysGlobal.HTML.InitLang(sysGlobal.StringUtils.GetExtension(InputFile));
                        sysGlobal.HTML.Parse(WriteLineNumbers, UseUTF, DefaultCSSFile, InputFile, OutputFile);
                    }
                    else
                    {
                        sysGlobal.Log.writeLog("Входной файл не найден.", "Error");
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Ошибка : входной файл " + InputFile + " не найден...");
                        Console.ForegroundColor = ConsoleColor.Gray;
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Внимание: Нельзя использовать ключи [-i] и [-o] совместно с ключами [-din] и [-dout] (см. -help)");
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
            }

            if ((Parameters["din"] != null) && (Parameters["dout"] != null))
            {
                if ((Parameters["i"] == null) && (Parameters["o"] == null))
                {
                    sysGlobal.Log.writeLog("Попытка поиска входной папки...", "");
                    InputDirectory = Parameters["din"];
                    OutpuDirectory = Parameters["dout"];
                    DirectoryInfo dirIn = new DirectoryInfo(InputDirectory);
                    DirectoryInfo dirOut = new DirectoryInfo(OutpuDirectory);
                    if (!dirOut.Exists)
                    {
                        dirOut.Create();
                    }
                    if (dirIn.Exists)
                    {
                        sysGlobal.Log.writeLog("Входная директория успешно найдена.", "OK");
                        for (int i = 0; i < sysGlobal.Plugin.PluginExt.Count; i++)
                        {
                            Files.AddRange(Directory.GetFiles(InputDirectory, "*." + sysGlobal.Plugin.PluginExt[i],SearchOption.AllDirectories));
                        }
                        for (int i = 0; i < Files.Count; i++)
                        {
                            Console.ForegroundColor = ConsoleColor.White;
                            Console.WriteLine("Обрабатывается: " + Files[i] + " ");
                            Console.ForegroundColor = ConsoleColor.Gray;
                            sysGlobal.HTML.InitLang(sysGlobal.StringUtils.GetExtension(Files[i].ToString()));
                            FileInfo File = new FileInfo(Files[i].ToString());
                            sysGlobal.HTML.Parse(WriteLineNumbers, UseUTF, DefaultCSSFile, Files[i].ToString(), OutpuDirectory + "\\" + File.Name + ".html");
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine("Готово...");
                            Console.ForegroundColor = ConsoleColor.Gray;
                        }
                        FileInfo FileCSS = new FileInfo(DefaultCSSFile);
                        FileCSS.CopyTo(OutpuDirectory + "\\" + DefaultCSSFile, true);
                    }
                    else
                    {
                        sysGlobal.Log.writeLog("Входная директория не найдена.", "Error");
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Ошибка : Входная директория " + InputDirectory + " не найдена...");
                        Console.ForegroundColor = ConsoleColor.Gray;
                    }
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Внимание: Нельзя использовать ключи [-i] и [-o] совместно с ключами [-din] и [-dout] (см. -help)");
                    Console.ForegroundColor = ConsoleColor.Gray;
                }
            }

            if ((Parameters["pluginfo"] != null) && (Parameters["pluginfo"] == "true"))
            {
                sysGlobal.Plugin.PluginsInfo();
            }

            if ((Parameters["help"] != null) && (Parameters["help"] == "true"))
            {
                getHelp();
            }

            if (args.Length == 0)
            {
                getHelp();
                sysGlobal.Log.stopLog();
                Environment.Exit(0);
            }

            sysGlobal.Log.stopLog();
        }

        /// <summary>
        /// View help
        /// </summary>
        static void getHelp()
        {
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("           --------------- Sourcecode2HTML " + _version + " ----------------");
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine("Использование: sourcecode2html [-i <файл>] [-din <дериктория>] [-o <файл>] [-dout <дериктория>] [-linenumbers] " +
                              "[-css <файл>] [-use-utf]");
            Console.WriteLine();
            Console.WriteLine("Параметры:");
            Console.WriteLine(" -i <файл>                 Задание входного файла");
            Console.WriteLine(" -din <дериктория>         Задание входной дериктории");
            Console.WriteLine(" -o <файл>                 Задание выходного файла");
            Console.WriteLine(" -dout <дериктория>        Задание выходной дериктории");
            Console.WriteLine(" -linenumbers              Включение отображения номеров строк в выходном файле");
            Console.WriteLine(" -css <файл>               Задание файла со стилями оформления");
            Console.WriteLine(" -use-utf                  Использование кодировки UTF-8 в выходном файле");
            Console.WriteLine(" -pluginfo                 Вывод информации о найденных плагинах");
            Console.WriteLine(" -help                     Вывод справки");
            Console.WriteLine();
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine("Внимание: Нельзя использовать ключи [-i] и [-o] совместно с ключами [-din] и [-dout]");
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.WriteLine();
        }
    }
}